package main

import "fmt"

var arr [7]int = [7]int{1, 2, 3, 4, 5, 6, 7}

func main() {
	demo()
	fmt.Println("------------------")
	demo1()
}

func demo() {
	a := arr[0:5] //左闭右开
	fmt.Printf("切片，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))
	a[1] = 11
	fmt.Printf("索引赋值，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))

	b := make([]int, 0, 5)
	b = append(b, 11)
	b = append(b, 77)

	a = append(a, b...) //利用...语法糖 把切片展开
	fmt.Printf("第一次追加，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))

	b[1] = 777
	fmt.Printf("没扩容之前修改b，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))

	a = append(a, 88)
	fmt.Printf("第二次追加，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))
	// 这里我们看下面的结果是底层数组已经发生改变了， 切片扩容了， 已经不在是引用的原有的切片了

	a[3] = 33
	fmt.Printf("扩容后索引赋值，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))

	b[1] = 777
	fmt.Printf("扩容后切片b索引赋值，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr, a, cap(a))

	// result
	// 切片，第一个索引地址=0xb67e60,arr=[1 2 3 4 5 6 7] slice=[1 2 3 4 5]，cap=7
	// 索引赋值，第一个索引地址=0xb67e60,arr=[1 11 3 4 5 6 7] slice=[1 11 3 4 5]，cap=7
	// 第一次追加，第一个索引地址=0xb67e60,arr=[1 11 3 4 5 11 77] slice=[1 11 3 4 5 11 77]，cap=7
	// 第二次追加，第一个索引地址=0xc0000d8000,arr=[1 11 3 4 5 11 77] slice=[1 11 3 4 5 11 77 88]，cap=14
	// 扩容后索引赋值，第一个索引地址=0xc0000d8000,arr=[1 11 3 4 5 11 77] slice=[1 11 3 33 5 11 77 88]，cap=14
	// 扩容后切片b索引赋值，第一个索引地址=0xc0000d8000,arr=[1 11 3 4 5 11 77] slice=[1 11 3 33 5 11 77 88]，cap=14

	// 总结：
	// 1. 我们看没扩容之前修改切片的时候，无论是切片索引修改， 还是append追加修改都会修改底层数组
	// 2. 这里我们看第二次追加， 我们切片的长度超长， 发生了扩容 。扩容后就是指向新的底层数组

}

//这里我们可以看出copy函数是进行的深拷贝， 修改复制后的切片不会修改到原数组
func demo1() {
	var arr1 [7]int = [7]int{1, 2, 3, 4, 5, 6, 7}

	a := arr1[:]
	b := make([]int, len(a), cap(a))
	copy(b, a)
	fmt.Printf("切片，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr1, a, cap(a))
	fmt.Printf("切片，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", b, arr1, b, cap(b))

	b[1] = 11
	fmt.Printf("切片，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", a, arr1, a, cap(a))
	fmt.Printf("切片，第一个索引地址=%p,arr=%v slice=%v，cap=%d \n", b, arr1, b, cap(b))

}
